package com.bdqn.wx.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;

public interface IBaseDao<T> {

	/**
	 * 获取session对象
	 * 
	 * @return
	 */
	Session getSession();

	/**
	 * 保存数据
	 * 
	 * @param record
	 *            需要保存的对象
	 */
	void save(T record);

	/**
	 * 根据主键删除数据
	 * 
	 * @param id
	 *            需要删除数据的主键
	 */
	void delete(Serializable id);

	/**
	 * 根据数据对象删除数据库中对应的数据
	 * 
	 * @param record
	 *            需要删除的记录
	 */
	void delete(T record);

	/**
	 * 根据指定的对象修改对应的数据
	 * 
	 * @param record
	 *            修改后的数据对象
	 */
	void update(T record);

	/**
	 * 根据主键查询数据
	 * 
	 * @param id
	 *            需要查询数据的主键
	 * @return 返回查找到的数据，如果没有返回null
	 */
	T findById(Serializable id);

	/**
	 * 根据指定的HQL语句和参数查询数据
	 * 
	 * @param hql
	 *            需要执行查询的HQL语句
	 * @param params
	 *            执行的HQL语句所需的参数，如果没有填写null
	 * @return 返回查询的结果，如果出现异常返回null
	 */
	List<T> find(String hql, Map<String, Object> params);

	/**
	 * 根据指定的HQL语句和参数以及分页所需的数据执行查询
	 * 
	 * @param hql
	 *            需要执行查询的HQL语句
	 * @param pageIndex
	 *            需要查询的页数
	 * @param pageSize
	 *            每页显示的数据条数
	 * @param params
	 *            执行HQL语句所需的参数，如果没有参数填写null
	 * @return 返回分页查询的结果，是一个Map对象,该对象包含<blockquote>
	 *         <b>data：</b>查询结果的数据集合是一个List对象<br>
	 *         <b>pageIndex：</b>当前查询的页码<br>
	 *         <b>pageSize：</b>每页显示的数据条数<br>
	 *         <b>total：</b>数据的总条数<br>
	 *         <b>pageTotal：</b>数据的总页数<br>
	 *         <b>hasNext：</b>是否有下一条数据<br>
	 *         <b>hasPrev：</b>是否有上一条数据<br>
	 *         </blockquote>
	 */
	Map<String, Object> find(String hql, int pageIndex, int pageSize,
			Map<String, Object> params);

	/**
	 * 分页查询数据
	 * 
	 * @param pageIndex
	 *            需要查询的页数
	 * @param pageSize
	 *            每页显示的数据条数
	 * @return 返回分页查询的结果，是一个Map对象,该对象包含<blockquote>
	 *         <b>data：</b>查询结果的数据集合是一个List对象<br>
	 *         <b>pageIndex：</b>当前查询的页码<br>
	 *         <b>pageSize：</b>每页显示的数据条数<br>
	 *         <b>total：</b>数据的总条数<br>
	 *         <b>pageTotal：</b>数据的总页数<br>
	 *         <b>hasNext：</b>是否有下一条数据<br>
	 *         <b>hasPrev：</b>是否有上一条数据<br>
	 *         </blockquote>
	 */
	Map<String, Object> find(int pageIndex, int pageSize);

	/**
	 * 根据DetachedCriteria 对象设置的条件查询数据，该功能不具备分页操作
	 * 
	 * @param detachedCriteria
	 *            需要设置的对象查询条件
	 * @return 返回查询数据的集合,如果出现异常返回null
	 */
	List<T> find(DetachedCriteria detachedCriteria);

	/**
	 * 根据 DetachedCriteria 设置的条件进行分页查询
	 * 
	 * @param detachedCriteria
	 *            需要设置的对象查询条件
	 * @param pageIndex
	 *            需要查询的页数
	 * @param pageSize
	 *            每页显示的数据条数
	 * @return 返回分页查询的结果，是一个Map对象,该对象包含<blockquote>
	 *         <b>data：</b>查询结果的数据集合是一个List对象 <br>
	 *         <b>pageIndex：</b>当前查询的页码<br>
	 *         <b>pageSize：</b>每页显示的数据条数<br>
	 *         <b>total：</b>数据的总条数<br>
	 *         <b>pageTotal：</b>数据的总页数<br>
	 *         <b>hasNext：</b>是否有下一条数据<br>
	 *         <b>hasPrev：</b>是否有上一条数据<br>
	 *         </blockquote>
	 */
	Map<String, Object> find(DetachedCriteria detachedCriteria, int pageIndex,
			int pageSize);

}
